/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ufg.inf.es.agenda.presistencia.impl;

import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import ufg.inf.es.agenda.Model.ObjetoPersistente;
import ufg.inf.es.agenda.presistencia.Conexao;

/**
 * DAO genérico responsável pela comunicação com o SGBD. Tem o intuito de
 * inserir, atualizar, remover e realizar buscas dos dados persistidos por esta
 * aplicação. Foi implementado utilizando o framework Hibernate e realizando
 * conexões com o MySQL
 *
 * @author wilker
 */
public class GenericDAO {

    private static Conexao conexao = Conexao.getConexao();
    private static GenericDAO dao;

    static {
        dao = new GenericDAO();
    }

    public static GenericDAO getInstancia() {
        if (dao == null) {
            dao = new GenericDAO();
        }

        return dao;
    }

    /**
     * Persiste o objeto recebido pro parâmetro no banco de dados da aplicaçaõ
     * 
     */
    public static void salvar(ObjetoPersistente objeto) {
        Session sessao = conexao.getSessao();
        Transaction tx = sessao.beginTransaction();
        sessao.saveOrUpdate(objeto);
        tx.commit();
        sessao.close();
    }

    /**
     * Lista todos os dados relacionados a um determinado objeto contidos no 
     * Banco de Dados da aplicação.
     * 
     */
    public static List listarTodos(Class clazz) {
        Session sessao = conexao.getSessao();
        List lista = sessao.createQuery("from " + clazz.getSimpleName()).list();
        sessao.close();
        return lista;
    }

    /**
     * Realiza a exclusão do objeto recebido por parâmetro no Banco de Dados
     * da aplicação.
     * 
     */
    public static void remover(ObjetoPersistente objeto) {
        Session sessao = conexao.getSessao();
        Transaction tx = sessao.beginTransaction();
        sessao.delete(objeto);
        tx.commit();
        sessao.close();
    }

    /**
     * Realiza a atualização do objeto recebido por parâmetro no Banco de Dados
     * da aplicação.
     * 
     */
    public static void atualizar(ObjetoPersistente obj) {
        Session sessao = conexao.getSessao();
        Transaction tx = sessao.beginTransaction();
        sessao.update(obj);
        tx.commit();
        sessao.close();
    }

    /**
     * Realiza uma busca no Banco de Dados, retornando uma lista de todos os 
     * dados referente a um objeto.
     * 
     * Tem como entrada a classe a qual o objeto pertence e a condição de busca
     * requerida.
     */
    public static List busca(Class classe, String condicao) {
        Session sessao = conexao.getSessao();
        List lista = sessao.createQuery("FROM " + classe.getSimpleName() + " WHERE " + condicao).list();
        sessao.close();
        return lista;
    }
}
